import { Options, Connection, Channel } from "amqplib";
import { useMq } from "./useMq";

/**
 * 向指定的主题发布消息。
 * 
 * 此函数使用AMQP协议将消息发布到指定的主题上。它首先建立一个MQ连接，然后创建一个通道，
 * 确认交换机存在，最后发送消息。如果在操作过程中出现错误，将抛出异常。
 * 
 * @param topicName 主题名称，消息将发布到这个主题。
 * @param routingKey 路由键，用于指定消息的路由规则。
 * @param msg 要发布的消息内容，必须是Buffer类型。
 * @param options 发布选项，例如消息的持久化等。
 * @throws 如果发布消息过程中出现任何错误，将抛出异常。
 */
export async function publishToTopic(topicName: string, routingKey: string, msg: Buffer, options: Options.Publish) {
    let con: Connection | undefined = undefined;
    let channel: Channel | undefined = undefined;
    try {
        con = await useMq()
        channel = await con.createChannel()
        await channel.assertExchange(topicName, 'topic', { durable: true }).catch(e => console.error(e))
        console.log(`publish to ${topicName} routingKey ${routingKey}`)
        return channel.publish(topicName, routingKey, msg, options)
    } catch (e) {
        console.error(e)
        throw e;
    } finally {
        if (channel) await channel.close().catch(e => console.error(e))
        if (con) await con.close().catch(e => console.error(e))
    }
}